package leetcode_题库;

/**
 * Created by IntelliJ IDEA.
 *
 * @ProjectName leetcode
 * @Author Ding
 * @CreateTime 2022/8/23 16:50 星期二
 */
public class _383_赎金信 {
    public static void main(String[] args) {
        String ransomNote = "a";
        String magazine = "ab";
        System.err.println(canConstruct(ransomNote, magazine));
    }

    /**
     * 【mine】 使用int数组替代哈希表
     * 执行用时：1 ms，在所有 Java 提交中击败了99.91%
     * 内存消耗：41.6 MB, 在所有 Java 提交中击败了67.29%的用户
     *
     * @param ransomNote ransomNote
     * @param magazine   magazine
     * @return Boolean
     */
    public static boolean canConstruct(String ransomNote, String magazine) {
        //定义一个数组（计数器）
        int[] table = new int[26];
        //定义字符数组，将盒子转为数组
        char[] chars = magazine.toCharArray();
        //遍历，由于是26个小写字母，则可以对照ASCII转成int数组，下标为字符映射，值为计数
        for (char c : chars) {
            table[c - 'a']++;
        }
        //遍历待查字符串，若第i个字符对照字符数组中数量-1<0了，说明false了
        for (int i = 0; i < ransomNote.length(); i++) {
            if (--table[ransomNote.charAt(i) - 'a'] < 0) {
                return false;
            }
        }
        return true;
    }
}
